#!/usr/bin/perl

#TODO Los directorios tendrian que salir de la instalacion, reemplazar!
my $opcionBusquedaDisp;
my @resultado;
my @campos;
#my $dirDisponible = "../PROCDIR";
my $dirDisponible = $ENV{'PROCDIR'};
#my $dirReservaOK = "../PROCDIR/reservas.ok";
my $dirReservaOK = $ENV{'PROCDIR'}."/reservas.ok";
#my $dirSalidaDisponible = "../REPODIR/";
my $dirSalidaDisponible = $ENV{'REPODIR'}."/";
#my $dirSalidaTicket = "../REPODIR/";
my $dirSalidaTicket = $ENV{'REPODIR'}."/";
#my $dirSalidaRanking = "../REPODIR/";
my $dirSalidaRanking = $ENV{'REPODIR'}."/";
#my $dirInvitados = "../REPODIR/";
my $dirInvitados = $ENV{'REPODIR'}."/";
#my $dirSalidaInvitados = "../REPODIR/";
my $dirSalidaInvitados = $ENV{'REPODIR'}."/";
my $modo;
my $imprimir = 0;
my $opcion = "";
my @valoresRanking;
my @resrvasOK;
my %eventos;
my $idEventoSelec;
my $descEventoSelec;
my $opcionBusquedaDisp = 0;

my $processCount = `ps aux | grep -c "/usr/bin/perl Imprimir_A.pl"`;
my $isInstall = $ENV{'INICIALIZADO'};


sub imprimirErrorArgumentos {
	print "\nUso: ./Imprimir.pl -modo -w(grabar, opcional)\n";
   	print "Modos: -d: Disponibles, -i: Invitados, -a: Ayuda, -t: Tickets, -r: Ranking\n\n";
	exit;
}

sub imprimirSeparador {
	print "*****************************************************************************************\n";
}

sub imprimirSalida {
	if ($imprimir) {
		open (SALIDA,">$archivoSalida");
	}
	print "Resultados: \n";
	foreach (@resultado){
		print $_;
		if ($imprimir) {
			print SALIDA $_;
		}
	};
	
	print "\n";
	exit;
}


sub imprimirCabezara {
	&imprimirSeparador;
	print $titulo."\n";
	&imprimirSeparador;
}

sub limpiarPantalla {
	print "\033[2J";    #clear the screen
	print "\033[0;0H"; #jump to 0,0
}


sub formatearRegistroDisponible {
	$reigtroFormateado = @campos[0]."-".@campos[1]."-".@campos[2]."-".@campos[3]."-".@campos[4]."-".@campos[5]."-".@campos[6]."\n";
}

sub formatearRegistroTickets {
	$reigtroFormateado = $tComprobanteTicket.";".@camposOK[1].";".@camposOK[2].";".@camposOK[3]."".@camposOK[4].";".@camposOK[5].";".@camposOK[6]."\n";
}

sub buscarEnArchivo {
	opendir(DIR, $dirDisponible) or die $!;
	while (my $file = readdir(DIR)) {
        	# Use a regular expression to ignore files beginning with a period
        	if ($file =~ /\.dis$/) {
			open(FILE, $dirDisponible.'/'.$file) or die $!;
			@array = <FILE>;
			# Asigna al arreglo todos los registros del archivo.
			foreach (@array){
				@campos = split(";",$_);
				&formatearRegistroDisponible;
				if($valor == @campos[$idx]) {
					push(@resultado, $reigtroFormateado);
				}
			};
			close(FILE);
		}
    	}
    	closedir(DIR);
}

sub buscarEnArchivoPorRango {
	opendir(DIR, $dirDisponible) or die $!;
	while (my $file = readdir(DIR)) {
        	# Use a regular expression to ignore files beginning with a period
        	if ($file =~ /\.dis$/) {
			open(FILE, $dirDisponible.'/'.$file) or die $!;
			@array = <FILE>;
			# Asigna al arreglo todos los registros del archivo.
			foreach (@array){
				@campos = split(";",$_);
				&formatearRegistroDisponible;
				if(@campos[$idx] >= $desde && @campos[$idx] <= $hasta) {
					push(@resultado, $reigtroFormateado);
				}
			};
			close(FILE);
		}
    	}
    	closedir(DIR);
}

sub buscarTicketsEnArchivo {
	open(FILE, $dirReservaOK) or die "No se encontro el archivo resevas.ok";
	@array = <FILE>;
	# Asigna al arreglo todos los registros del archivo.
	foreach (@array){
		@camposOK = split(";",$_);
		if($idComboTicket == @camposOK[7]) {
			$cantButacas = @camposOK[6];
			while ($cantButacas > 1) {
				$tComprobanteTicket = "VALE POR 2 ENTRADAS";
				&formatearRegistroTickets;
				push(@resultado, $reigtroFormateado);
				$cantButacas = $cantButacas - 2;
			}
			if ($cantButacas == 1) {
				$tComprobanteTicket = "VALE POR 1 ENTRADA";
				&formatearRegistroTickets;
				push(@resultado, $reigtroFormateado);
			}
		}
	};
	close(FILE);
}

sub obtenerValoresRanking {
	open(FILE, $dirReservaOK) or die "No se encontro el archivo resevas.ok";
	@array = <FILE>;
	my %rankingHash;

	foreach (@array){
		my @cRanking = split(";",$_);
		if(!exists($rankingHash{@cRanking[10]})) {
			$rankingHash{@cRanking[10]} = @cRanking[6];
		} else {
			$rankingHash{@cRanking[10]} = $rankingHash{@cRanking[10]} + @cRanking[6];		
		}
	};

	my @keysRank = keys(%rankingHash);
	foreach (@keysRank){
		push(@valoresRanking,$rankingHash{$_}.";".$_);
	};

	@valoresRanking = sort(@valoresRanking);
	close(FILE);
}

sub cargarReservasOK {
	open(FILE, $dirReservaOK) or die "No se encontro el archivo resevas.ok";
	@reservasOK = <FILE>;
	close(FILE);
}

sub cagarEventos {
	foreach (@reservasOK){
		my @reserva = split(";",$_);
		if(!exists($eventos{@reserva[7]})) {
			my $dsc = "Evento: ".@reserva[7]." Obra: ".@reserva[0]." - ".@reserva[1]." Fecha y Hora: ".@reserva[2]." -  ".@reserva[3]." Hs. Sala: ".@reserva[4]." - ".@reserva[5];
			$eventos{@reserva[7]} = $dsc;
		}
	};
	print $eventos;
}

sub seleccionarEvento {
	&cargarReservasOK;
	&cagarEventos;
	my @idsEventos = keys(%eventos);
	my $idxEv = 0;
	print "\n";
	foreach (@idsEventos){
		$idxEv = $idxEv + 1;
		my $descEvento = $eventos{$_};
		print "(".$idxEv.") - ".$descEvento."\n";
	};
	print "\n";
	&imprimirSeparador;
	my $seleccionEv = 0;
	while ($seleccionEv < 1 || $seleccionEv > $idxEv) {
		print "Ingrese el numero de orden (n) del evento deseado: ";	
		$seleccionEv = <STDIN>;
		print "\n";
	}
	$idEventoSelec = @idsEventos[$seleccionEv - 1];
	$descEventoSelec = $eventos{$idEventoSelec};
}

sub listarInvitados {
	push(@resultado,"Referencia Interna: ".$idRefInterno."\n");
	$invFile = $dirInvitados.$idRefInterno.".inv";
	$butacasTotal = 0;
	if (-e $invFile) {
		open(FILE, $invFile) or die "No se encontro el archivo ".$invFile;
		@invitados = <FILE>;
		foreach (@invitados){
			$butacasTotal = $butacasTotal + 1;
			my @regInv = split(";",$_);
			my $nCampos = @regInv;
			my $acomp = 0;
			my $invitado = 0;
			my $invitado = @regInv[0]; 
			if($nCampos == 1) {
				$invitado =~ s/[\r\n]+//g;			
			}
			if($nCampos == 2 && @regInv[1] =~ /\d*/) {
				$butacasTotal = $butacasTotal + @regInv[1];
				$acomp = 0 + @regInv[1];				
			}
			if($nCampos == 3) {
				$butacasTotal = $butacasTotal + @regInv[2];
				$acomp = 0 + @regInv[2];
			}
			my $entrada = $invitado.",".$acomp.",".$butacasTotal;
			push(@resultado,$entrada."\n");
		};
		close(FILE);
	}  else {
		push(@resultado,"Sin listado de invitados.\n");
	}
}

sub resultadosInvitados {
	push(@resultado,$descEventoSelec."\n");
	foreach (@reservasOK){
		my @reserva = split(";",$_);
		if($idEventoSelec eq @reserva[7]) {
			$idRefInterno = @reserva[8];
			&listarInvitados;
			my $total = $butacasTotal + @reserva[9];
			push(@resultado,"Butacas Total:".$total.".\n");
		}
	};
}

# Para Imprimir_A -i
sub generarInformeInvitados {
	$titulo = "Seleccion de eventos";
	&imprimirCabezara($titulo);
	&seleccionarEvento;
	&limpiarPantalla;
	$titulo = "Informe de invitados";
	&imprimirCabezara($titulo);
	&resultadosInvitados;
	if($imprimir) {
		$archivoSalida = $dirSalidaInvitados.$idEventoSelec.".inv";
	}
	&imprimirSalida;
}

# Para Imprimir_A -r
sub generarRanking {
	&obtenerValoresRanking;
	$posRanking = @valoresRanking;
	$posRanking = $posRanking - 1;
	if( $posRanking > 9) {
		$posRanking = 9;
	}
	while ($posRanking >= 0) {
		my @camposR = split(";",@valoresRanking[$posRanking]);
		push(@resultado, @camposR[1].",".@camposR[0]."\n");
		$posRanking = $posRanking - 1;
	}
	
}

sub buscarObra {
	$titulo = "Busqueda por Obra";
	&imprimirCabezara($titulo);
	print "Ingrese el id de la obra: ";
	$valor = <STDIN>;
	$idx = 1;
	&buscarEnArchivo;
}

sub buscarSala {
	$titulo = "Busqueda por Sala";
	&imprimirCabezara($titulo);
	print "Ingrese el id de la sala: ";
	$valor = <STDIN>;
	$idx = 4;
	&buscarEnArchivo;
}

sub buscarRangoObra {
	$titulo = "Busqueda por rango de Obra";
	&imprimirCabezara($titulo);
	print "Ingrese el id desde: ";
	$desde = <STDIN>;
	print "\n";
	print "Ingrese el id hasta: ";
	$hasta = <STDIN>;
	$idx = 1;
	&buscarEnArchivoPorRango;
}

sub buscarRangoSala {
	$titulo = "Busqueda por rango de Sala";
	&imprimirCabezara($titulo);
	print "Ingrese el id desde: ";
	$desde = <STDIN>;
	print "\n";	
	print "Ingrese el id hasta: ";
	$hasta = <STDIN>;
	$idx = 4;
	&buscarEnArchivoPorRango;
}

sub listarDisponibilidad {

	$titulo = "Infome Disponibilidad - Seleccione criterio de busqueda";
	&imprimirCabezara($titulo);

	print "\n\n";
	print "1- ID Obra\n";
	print "2- ID Sala\n";
	print "3- Rango ID Obra\n";
	print "4- Rango ID Sala\n\n";

	&imprimirSeparador;
	
	print "Su eleccion: ";
	$opcionBusquedaDisp = <STDIN>;
}

# Para Imprimir_A -d	
sub procesarDisponibles {
	my $preguntar = 1;
	while ($preguntar) {
	 	&limpiarPantalla;
		&listarDisponibilidad;
		if (($opcionBusquedaDisp == 1) || ($opcionBusquedaDisp == 2)
			|| ($opcionBusquedaDisp == 3) || ($opcionBusquedaDisp == 4)) {
			$preguntar = 0;
		}
	}

	if (($opcionBusquedaDisp == 1)){
		&limpiarPantalla;
		&buscarObra;
	}
	if (($opcionBusquedaDisp == 2)){
		&limpiarPantalla;
		&buscarSala;
	}
	if (($opcionBusquedaDisp == 3)){
		&limpiarPantalla;
		&buscarRangoObra;
	}
	if (($opcionBusquedaDisp == 4)) {
		&limpiarPantalla;
		&buscarRangoSala;
	}
	if($imprimir) {
		$nombreSalidaDisponible = "combos";
		while ($nombreSalidaDisponible eq "combos") {
			print "\nIngrese el Nombre del archivo de salida: ";
			$nombreSalidaDisponible = <STDIN>;
			chomp($nombreSalidaDisponible);
		}	
		$archivoSalida = $dirSalidaDisponible.$nombreSalidaDisponible.".dis";
	}
	&limpiarPantalla;
	&imprimirSalida;
}

# Para Imprimir_A -t
sub procesarTickets {
	$titulo = "Infome Tickets";
	&imprimirCabezara($titulo);

	print "\n\n";
	print "Ingrese el id del combo: ";
	$idComboTicket = <STDIN>;
	chomp($idComboTicket);
	&buscarTicketsEnArchivo;
	
	if($imprimir) {
		$archivoSalida = $dirSalidaTicket.$idComboTicket.".tck";
	}
	&limpiarPantalla;
	$titulo = "Infome Tickets";
	&imprimirCabezara($titulo);
	&imprimirSalida;
}

sub procesarRanking {
	$titulo = "Ranking de Eventos";
	&imprimirCabezara($titulo);
	&generarRanking;
	if($imprimir) {
		my @chars = ("A".."Z", "a".."z", "0".."9");
		my $rndExt;
		$rndExt .= $chars[rand @chars] for 1..3;
		$archivoSalida = $dirSalidaRanking."ranking.".$rndExt;
	}
	&imprimirSalida;
}

sub validarCorrida {
	if ($isInstall != 1) {
		print "Compruebe que la aplicacion se encuentr correctamente instalada e inicializada.\n";
		exit;
	}
	if ($processCount > 2) {
		print "No es posible acceder al comando Impmrimir_A en este momento.\n";
		exit;
	}
}

#Bloque de logica principal


&validarCorrida;

$num_args = $#ARGV + 1;
if ($num_args > 2 || $num_args < 1) {
	&imprimirSeparador;	
	print "Cantidad de argumentos invalida. \n";
	&imprimirSeparador;
	print "\n";	
 	&imprimirErrorArgumentos;
}

if ($num_args == 2) {
	if($ARGV[1] ne '-w') {
		&imprimirSeparador;
		print "El argumento $ARGV[1] no es valido \n";
		&imprimirSeparador;
		print "\n";
		&imprimirErrorArgumentos;
	} else {
		$imprimir = 1;
	}	
}

undef(@resultado);
undef(@valoresRanking);
undef(@resrvasOK);
	
if($ARGV[0] eq '-d') {
	$opcion = $ARGV[0];	
	&procesarDisponibles;
}

if($ARGV[0] eq '-t') {
	$opcion = $ARGV[0];	
	&procesarTickets;
}

if($ARGV[0] eq '-r') {
	$opcion = $ARGV[0];	
	&procesarRanking;
}

if($ARGV[0] eq '-i') {
	$opcion = $ARGV[0];	
	&generarInformeInvitados;
}

if($ARGV[0] eq '-a') {
	&imprimirErrorArgumentos;
}

if($opcion eq "") {
	print "El argumento $ARGV[0] no es valido \n";
	&imprimirErrorArgumentos;
}

undef(@resultado);
undef(@valoresRanking);
undef(@resrvasOK);

